package com.csmht.tododemo.aspect;

/**
 * TodoCheckAspect - AOP切面类
 * 用于在TodoService的put方法执行前进行业务逻辑检查
 * 主要功能包括：
 * 1. 检查待办事项标题和内容中是否包含违禁词
 * 2. 若包含违禁词则抛出异常阻止操作
 */

import com.csmht.tododemo.constant.MessageConstant;
import com.csmht.tododemo.exiception.BaseException;
import com.csmht.tododemo.mapper.TodoMapper;
import com.csmht.tododemo.pojo.entity.Todo;
import com.csmht.tododemo.properties.ProhibitedWordProperties;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class TodoCheckAspect {

    @Pointcut("execution(* com.csmht.tododemo.service.TodoService.put(Long))")
    public void checkPointCut(){}

    @Resource
    private ProhibitedWordProperties prohibitedWordProperties;

    @Resource
    private TodoMapper todoMapper;

    @Before("checkPointCut()")
    /**
     * 前置通知方法：在切入点方法执行前执行
     * 用于检查待办事项中是否包含违禁词
     * @param joinPoint 连接点对象，用于获取方法参数
     */
    void before(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        if(args[0] instanceof Long todoId){
            // 根据ID查询待办事项
            Todo todo = todoMapper.selectById(todoId);
            
            // 遍历所有违禁词进行检查
            for (String prohibitedWord : prohibitedWordProperties.getWords()) {
                // 检查标题和内容中是否包含当前违禁词
                if(todo.getTitle().contains(prohibitedWord) || todo.getMessage().contains(prohibitedWord)){
                    // 若包含违禁词，抛出异常阻止操作
                    throw new BaseException(MessageConstant.CANNOT);
                }
            }
        }
    }

}